home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / qa / src / qa.c < prev   
C/C++ Source or Header  |  1993-07-08  |  9KB  |  345 lines

  1. // Q&A(FMTOWNS版)                /////  Tab Size : 4  /////
  2. //                                      /////  Margin : 120  /////
  3. // QA06.c    v1.0 L17
  4. //
  5. // (C)K.Konishi    11-Feb-93
  6. //
  7.  
  8. #define    MAIN
  9.  
  10. #include "Platform.h"
  11.  
  12. #include <EGB.h>
  13. #include <MOS.h>
  14. #include "aoi_lib1.h"
  15. #include <CDRFRB.h>
  16. #include "cd.h"
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <time.h>
  21. #include <conio.h>
  22. #include <FMCFRB.h>
  23. #include <msdos.cf>
  24.  
  25. AOIbuttonData    AbD[BUTTON];
  26.  
  27. #define    KeyESC        0x1b
  28. #define    Key1        0x31
  29. #define    Key9        0x39
  30. #define    KeyA        0x41
  31. #define    KeyZ        0x5A
  32. #define    Keya        0x61
  33. #define    Keyz        0x7A
  34. #define    FontSX        12
  35. #define    FontSY        12
  36. #define    FontAX        6
  37. #define    FontAY        12
  38. #define    INIT_X        250
  39. #define    INIT_Y        150
  40. #define    BUTTON_X    16
  41. #define    BUTTON_Y    16
  42. #define    BUTTON_FX    BUTTON_X + 1
  43. #define    BUTTON_FY    BUTTON_Y + 1
  44. #define    WIN_FRAME    5
  45. #define    WIN_FRAMEx2    (WIN_FRAME << 1)
  46.  
  47. enum {MENU, CONSOLE, TOWNS, CDPLAYER, HIGH, LOW, CDPLAY};
  48.  
  49. void AKANEmessage(void)
  50. {
  51.     puts("Q&A V1.0  (c)1992 KUNIZO KONISHI\n");
  52.     puts("run386 QA -[オプション] [質問] [選択肢1]・・・・・・\n");
  53.     puts(" -m      :  TownsMENU上で選択する");
  54.     puts(" -c      :  コンソール上で選択する");
  55. //    puts("\nrun386 QA -[オプション] -nD(画面非表示)\n");
  56. //    puts(" -towns  :  FMTOWNSの機種を判別する");
  57.     puts(" -high   :  高速モードを設定する");
  58.     puts(" -low    :  互換モードを設定する");
  59. //    puts(" -cdplay :  CDPLAYER");
  60. }
  61.  
  62. void AKANEbaseDraw(short sx, short sy, short lx, short ly, short bx, short by)
  63. {
  64.     AOIwinBase(sx, sy, lx, ly, 1);
  65.  
  66.     AOIbuttonBase(sx +  5, sy + 5, bx, by);
  67.     AOIbuttonBase(sx + 22, sy + 5, lx - 27, by);
  68.  
  69.     AOIsetButton(&AbD[1], WIN_FRAME, WIN_FRAME, BUTTON_X, BUTTON_Y);    // 終了
  70.     AOIsetButton(&AbD[2], WIN_FRAME + BUTTON_X, WIN_FRAME, lx - WIN_FRAMEx2 - BUTTON_X , BUTTON_Y);    // 移動
  71. }
  72.  
  73. void AKANEbuttonSet(short sx, short sy, short lx, short fs, char *argv[], short argvLen[], int a)
  74. {
  75.     short i;
  76.     AOIstringData    asD;    // AOIstrData型の変数宣言
  77.     
  78.     asD.sx = FontSX;
  79.     asD.sy = FontSY;
  80.     asD.ax = FontAX;
  81.     asD.ay = FontAY;
  82.     asD.sc = BLACK;
  83.     asD.ss = fs;
  84.     AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[2] * (FontAX >> 1), sy + 2 + BUTTON_FY, &asD, argv[2]);
  85.     
  86.     if (a != 0) {
  87.         for (i = 3; i < a + 3; i++) {
  88.             AOIbuttonBase(sx + WIN_FRAME, sy + WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
  89.             AOIsetButton(&AbD[i], WIN_FRAME, WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
  90.             AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[i] * (FontAX >> 1), sy + 2 + (i - 1) * BUTTON_FY,
  91.                      &asD, argv[i]);
  92.         }
  93.     }
  94. }
  95.  
  96. void AKANEgraphInit(void)
  97. {
  98.     int page, dpage, pri;
  99.  
  100.     EGB_resolution(work, 0, 0x43);        //  グラフィック仮想画面の設定
  101.     EGB_resolution(work, 1, 0x43);        //  グラフィック仮想画面の設定
  102.     page = EGB_getWritePage(0, 0);        //  書き込みページの読み取り
  103.     EGB_writePage(work, page | 0x40);    //  グラフィック書き込みページ
  104.     EGB_getDisplayPage(&dpage, &pri);    //  表示ページの読み取り
  105.     EGB_displayPage(work, dpage, pri);    //  グラフィック表示ページの指定
  106. }
  107.  
  108. void AKANEmouseInit(void)
  109. {
  110.     MOS_start(mwork, MosWorkSize);
  111.     MOS_typeRom(80 + 1, 0, 0, pat_work);
  112.     MOS_disp(1);
  113. }
  114.  
  115. short AKANEmouseWork(short *retNum, int argc, char *argv[])    // TownsMENU上での操作
  116. {
  117.     short j, dmyLen = 0;
  118.     short lx, ly;
  119.     short fs = 0x00;
  120.     short argvLen[11];
  121.     int    ch, mx, my;
  122.     int button = 0;
  123.     char endmark = 0;
  124.     char buttonLamp = OFF;
  125.     short sx = INIT_X,   sy = INIT_Y;
  126.     short bx = BUTTON_X, by = BUTTON_Y;
  127.     unsigned moji, encode;
  128.     char dispTmp[(640/8)*480];                //  ドットデータの読み書き作業領域
  129.  
  130.     if (argc < 3) {    //    パラメータの数をチェック
  131.         AKANEmessage();
  132.         *retNum = FALSE;
  133.         return FALSE;
  134.     }
  135.  
  136.     //    lx, ly を決める
  137.     for (j = 2; j < argc; j++) if (dmyLen < (argvLen[j] = strlen(argv[j]))) dmyLen = argvLen[j];
  138.     lx = WIN_FRAMEx2 + dmyLen * FontAX + 60;
  139.     ly = WIN_FRAMEx2 + (argc - 2) * BUTTON_FY - 1;
  140.  
  141.     // fs (フォントスタイル)を決める
  142.     if (!_strcmpi(argv[1], "-m0") || !_strcmpi(argv[1], "-m")) fs = 0x00;
  143.     if (!_strcmpi(argv[1], "-m1")) fs = 0x01;
  144.     if (!_strcmpi(argv[1], "-m2")) fs = 0x02;
  145.     
  146.     AKANEgraphInit();        // グラッフィクスの初期化
  147.     AOIgetGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
  148.     AKANEbaseDraw(sx, sy, lx, ly, bx, by);    // ウインドゥ描画
  149.     AKANEbuttonSet(sx, sy, lx, fs, argv, argvLen, argc - 3);
  150.     AKANEmouseInit();        // マウスの初期化
  151.     do {
  152.         MOS_rdpos(&ch, &mx, &my);
  153.         button = 0;
  154.         if (ch == 1) button = AOIbutton(sx, sy, mx, my, AbD);    // マウスの入力
  155.         moji = KYB_read(1, &encode);    // キーボートの入力
  156.         switch (moji) {
  157.             case KeyESC :        //    ESC
  158.                 button = 1;
  159.                 break;
  160.             case Key1..Key9 :    //    1~9
  161.                 button = moji - 46;
  162.                 if (argc - 3 < button - 2) button = 0;
  163.                 break;
  164.             case KeyA..KeyZ :    //    A~Z
  165.                 button = moji - 55;
  166.                 if (argc - 3 < button - 2) button = 0;
  167.                 break;
  168.             case Keya..Keyz :    //    a~z
  169.                 button = moji - 87;
  170.                 if (argc - 3 < button - 2) button = 0;
  171.                 break;
  172.         }
  173.         KYB_clrbuf();
  174.         if (button > 0) {            // ボタン反転
  175.             if (button != 18 && button != 19 && button != 20) {
  176.                 AOIbuttonLamp(sx, sy, &AbD[button]);
  177.                 buttonLamp = ON;
  178.                 MOS_typeRom(115 + 1, 0, 0, pat_work);    // マウスも変更
  179.                 if (button == 1) {
  180.                     MOS_typeRom(124 + 1, 0, 0, pat_work);
  181.                 }
  182.             }
  183.         }
  184.         switch (button) {
  185.             case 1 :
  186.                 endmark = 1;        // 終了条件設定
  187.                 *retNum = FALSE;
  188.                 break;
  189.             case 2 :                // 移動
  190.                 AOIwindowMove(dispTmp, &sx, &sy, lx, ly);
  191.                 break;
  192.             case 3..20 :
  193.                 endmark = 1;        // 値を返す
  194.                 *retNum = button - 2;
  195.                 break;
  196.         }
  197.         if (buttonLamp == ON) {                            // ボタンの反転
  198.             if (button > 0) {
  199.                 AOIbuttonLamp(sx, sy, &AbD[button]);
  200.                 buttonLamp = OFF;
  201.                 MOS_typeRom(80 + 1, 0, 0, pat_work);    // マウスも元通り
  202.             }
  203.         }
  204.     } while (endmark != 1);
  205.     MOS_end();
  206.     AOIputGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
  207. }
  208.  
  209. short AKANEconsoleWork(short *retNum, int argc, char *argv[])    //    コンソール上での選択
  210. {
  211.     unsigned moji, encode;
  212.     int button = 0;
  213.     char endmark = 0;
  214.     short item = 0;
  215.     
  216.     if (argc < 3) {    //    パラメータの数をチェック
  217.         AKANEmessage();
  218.         *retNum = FALSE;
  219.         return FALSE;
  220.     }
  221.     printf("%s\n\n", argv[2]);    //    質問の表示
  222.     for (item = 3; item < argc; item++) printf("   %d. %s\n", item - 2, argv[item]);    //    選択肢の表示
  223.     if (item == 4) printf("\n何かキーを押してください\n");
  224.     else printf("\n1 ~ %d の中から選んでください", item - 3);
  225.     do {
  226.         button = 0;
  227.         moji = KYB_read(1, &encode);
  228.         switch (moji) {
  229.             case KeyESC :        //    ESC
  230.                 button = 1;
  231.                 break;
  232.             case Key1..Key9 :    //    1~9
  233.                 button = moji - 46;
  234.                 if (item - 3 < button - 2) button = 0;
  235.                 break;
  236.             case KeyA..KeyZ :    //    A~Z
  237.                 button = moji - 55;
  238.                 if (item - 3 < button - 2) button = 0;
  239.                 break;
  240.             case Keya..Keyz :    //    a~z
  241.                 button = moji - 87;
  242.                 if (item - 3 < button - 2) button = 0;
  243.                 break;
  244.         }
  245.         KYB_clrbuf();
  246.         switch (button) {
  247.             case 1 :
  248.                 endmark = 1;        // 終了条件設定
  249.                 *retNum = FALSE;
  250.                 break;
  251.             case 3..20 :
  252.                 endmark = 1;        // 値を返す
  253.                 *retNum = button - 2;
  254.                 break;
  255.             default :
  256.                 printf("\r1 ~ %d の中から選んでください", item - 3);
  257.         }
  258.     } while (endmark != 1);
  259.     printf("\n");
  260. }
  261.  
  262. void AKANEtownsWork(short *retNum, char *argv[])    //    TOWNS機種判別
  263. {
  264.     char *machine[] = {"", "初代", "2代目", "3代目", "IIUX", "IICX"};
  265.     short m;
  266.     
  267.     m = AOItownsName();
  268.     if (_strcmpi(argv[2], "-nD")) {
  269.         if (m == 0) printf("わかりません\n");
  270.         else printf("このTOWNSは %s です\n", machine[m]);
  271.     }
  272.     *retNum = m;
  273.     return;
  274. }
  275.  
  276. void AKANEmodeWork(short *retNum, char *argv[], BYTE mode)    // IICXのモード設定
  277. {
  278.     short m;
  279.     
  280.     m = AOItownsName();
  281.     if (_strcmpi(argv[2], "-nD")) {
  282.         if (1 <= m && m <= 4) {
  283.             printf("このTOWNSは%sモードを設定できません\n", (mode == HIGH) ? "高速" : "互換");
  284.         } else {
  285.             printf("%sモードに設定しました\n", (mode == HIGH) ? "高速" : "互換");
  286.         }
  287.     }
  288.     outp(0x05ec, (mode == HIGH) ? 1 : 0);
  289.     *retNum = TRUE;
  290.     return;
  291. }
  292.  
  293. short StartingFunction(int argc, char *argv[])
  294. {
  295.     BYTE inputer;
  296.     short retNum;
  297.     
  298.     if (argc < 2) {
  299.         AKANEmessage();
  300.         return FALSE;
  301.     }
  302.     if (!strnicmp(argv[1], "-m", 2)) {    // -m -m1 -m2・・・ の場合
  303.         inputer = MENU;
  304.     } else if (!_strcmpi(argv[1], "-c")) {
  305.         inputer = CONSOLE;
  306.     } else if (!_strcmpi(argv[1], "-towns")) {
  307.         inputer = TOWNS;
  308.     } else if (!_strcmpi(argv[1], "-high")) {
  309.         inputer = HIGH;
  310.     } else if (!_strcmpi(argv[1], "-low")) {
  311.         inputer = LOW;
  312.     } else if (!_strcmpi(argv[1], "-cdplay")) {
  313.         inputer = CDPLAY;
  314.     } else {
  315.         AKANEmessage();
  316.         return FALSE;
  317.     }
  318.     
  319.     if (inputer == MENU) {        // TMENU(-m)のときの処理
  320.         AKANEmouseWork(&retNum, argc, argv);
  321.     }
  322.     if (inputer == CONSOLE) {    // コンソール(-c)のときの処理
  323.         AKANEconsoleWork(&retNum, argc, argv);
  324.     }
  325.     if (inputer == TOWNS) {        // TOWNS機種判別(-towns)のときの処理
  326.         AKANEtownsWork(&retNum, argv);
  327.     }
  328.     if (inputer == HIGH) {        // IICXの高速モード設定(-high)のときの処理
  329.         AKANEmodeWork(&retNum, argv, HIGH);
  330.     }
  331.     if (inputer == LOW) {        // IICXの互換モード設定(-low)のときの処理
  332.         AKANEmodeWork(&retNum, argv, LOW);
  333.     }
  334.     if (inputer == CDPLAY) {    // CDPLAYER(-cdplay)のときの処理
  335.         extern AKANEcdplayWork(void);
  336.         retNum = AKANEcdplayWork();
  337.     }
  338.     return retNum;
  339. }
  340.  
  341. short main(int argc, char *argv[])
  342. {
  343.     return StartingFunction(argc, argv);
  344. }
  345.